#include "mine_motor2_pwm.h"

/**
 * 	5,MOTOR1连接在TIM4_CH2上(PB7)
    6,MOTOR2连接在TIM4_CH1上(PB6)
    7,MOTOR3连接在TIM2_CH3上(PB10)
    8,MOTOR4连接在TIM2_CH1上(PA5)
 */
void mine_motor2_pwm_init()
{
    // gpio使能
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    // 定时器使能
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

    // pb7复用输出TIM2
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_TIM4);
    GPIO_InitTypeDef GPIO_InitStructure = {
        .GPIO_Pin = GPIO_Pin_6,
        .GPIO_Mode = GPIO_Mode_AF,
        .GPIO_Speed = GPIO_Speed_100MHz,
        .GPIO_OType = GPIO_OType_PP,
        .GPIO_PuPd = GPIO_PuPd_UP // 上拉电阻
    };
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    //
    // 配置定时器
    //TIM_DeInit(TIM4); // 复位
    TIM_TimeBaseInitTypeDef TIM_InitStructure = {
        .TIM_Period = ((1 << 8) - 1),          // 255,自动重装载值,96MHz/(255+1)=375KHz
        .TIM_Prescaler = 0,                    // 定时器分频
        .TIM_ClockDivision = 0,                // 时钟分频
        .TIM_CounterMode = TIM_CounterMode_Up, // 向上计数
        .TIM_RepetitionCounter = 0,            // 重复计数次数
    };
    TIM_TimeBaseInit(TIM4, &TIM_InitStructure);

    //
    TIM_OCInitTypeDef TIM_OCInitStructure = {
        .TIM_OCMode = TIM_OCMode_PWM1,             // PWM模式1
        .TIM_OutputState = TIM_OutputState_Enable, // 使能输出
        .TIM_Pulse = 0,                            // ccrx, // CCR 值，占空比 = 300 / 900 = 33.3%
        .TIM_OCPolarity = TIM_OCPolarity_High,     // 高电平有效
        .TIM_OCIdleState = TIM_OCIdleState_Set,   // 空闲高电平
    };
    TIM_OC1Init(TIM4, &TIM_OCInitStructure); // CH2 ,TIM4

    // 使能TIM4在CCR2上的预装载寄存器
    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

    //
    TIM_ARRPreloadConfig(TIM4, ENABLE); // TIM4	ARPE使能
    TIM_Cmd(TIM4, ENABLE);              // 使能TIM4
}

void mine_motor2_pwm_set(u16 val)
{
    u16 d = ((val) >> (16 - 8) & ((1 << 8) - 1));
    TIM_SetCompare1(TIM4, d);
}
